#ifndef Delegate_H
#define Delegate_H

#include "Global_Signal.h"
#include "abstractDelegate.h"

/*!
 *  \class Delegate
 *  \brief Représente un Delegate, à savoir une méthode membre d'un objet, ainsi que l'objet en question, utilisé conjointement avec un délégué
 */

template <class T>
class Delegate0 : public AbstractDelegate{
    public :

    T *         objetDelegate;                /*!< Objet devant éxécuté la méthode membre associé	         */
    int         (T::*pDelegate)();            /*!< Prototype du pointeur de la fonction membre à exécuter  */

    Delegate0(int (T::*apDelegate)(),T * ref);

    virtual void Run();

    template<class T>
     virtual  void Run(T arg)=0;

    template<class T, class U>
     virtual  void Run(T arg, U arg2)=0;

    template<class T, class U, class W>
     virtual  void Run(T arg, U arg2, W arg3)=0;
};

template <class T>
Delegate0<T>::Delegate0(int (T::*apDelegate)(),T * ref){
    pDelegate=apDelegate;
    objetDelegate=ref;
}

template <class T>
void Delegate0<T>::Run(){
    (objetDelegate->*pDelegate)();
}

template <class T, class U>
void Delegate0<T>::Run(u arg1){

}

template <class T, class U, class V>
void Delegate0<T>::Run( U arg1, V arg2){

}

template <class T>
void Delegate0<T>::Run(U arg1, V arg2, W arg3){

}
